﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once

#include "IEventArgs.h"
#include "GcmpUiViewInterface.h"

namespace gcmp
{
    /// \brief UiViewEventType 定义视图类事件类型。
    enum class UiViewEventType : int32_t
    {
        UiViewCreated,      ///< 当前工作视图创建后触发此事件。
        PreUiViewActivate,  ///< 当前工作视图激活前触发此事件。一般由新建视图或切换视图窗口导致。
        UiViewActivated,    ///< 当前工作视图激活后触发此事件。一般由新建视图或切换视图窗口导致。
        PreUiViewDeactivate,///< 当前工作视图被切换前触发此事件。一般由切换或关闭当前工作视图导致。
        UiViewDeactivated,  ///< 当前工作视图被切换后触发此事件。一般由切换或关闭当前工作视图导致。
        UiViewTryClose,     ///< 尝试关闭视图窗口前触发此事件，有可能最终并没有关闭视图。
        PreUiViewClose,     ///< 确认关闭视图窗口前触发此事件，视图即将被关闭。
        UiViewClosed,       ///< 视图窗口被关闭后触发此事件。
        UiViewReady,        ///< 视图初始化准备就绪，场景初始化完成，窗口显示。
        SceneBuild          ///< 视图场景搭建完成，该事件会频繁调用，请勿在此事件类型中调用耗时操作
    };

    class IUiView;

    /// \brief 视图类事件参数的接口。
    class GCMP_UI_VIEW_INTERFACE_EXPORT IUiViewEventArgs : public IEventArgs
    {
        DEFINE_CAST_DERIVED(gcmp::IUiViewEventArgs, gcmp::IEventArgs)

    public:
        /// \brief 获取视图类事件类型。
        /// 
        /// \return 返回视图类事件类型。
        virtual UiViewEventType GetType() const = 0;

        /// \brief 获取视图对象指针。
        /// 
        /// \return 返回视图对象指针。
        virtual IUiView* GetUiView() = 0;

        /// \brief 判断视图激活的类型。对应UiViewEventType::UiViewActivated事件。
        /// 
        /// \return 返回值表示视图激活的类型。返回true表示视图是由用户激活；返回false表示视图是由程序激活。 
        virtual bool IsUiViewActivatedByUser() = 0;

        /// \brief 判断视图关闭的类型。对应UiViewEventType::UiViewTryClose事件。
        /// 
        /// \return 返回值表示视图关闭的类型。返回true表示视图是由用户手动关闭；返回false表示视图是由程序自动关闭。 
        virtual bool IsUiViewClosedByUser() = 0;

        /// \brief 判断视图场景搭建类型。对应UiViewEventType::SceneBuild事件。
        /// 
        /// \return 返回值表示视图场景搭建类型。返回true表示视图是增量构建场景；返回false表示不是增量构建场景。 
        virtual bool IsUiViewIncrementallyBuildScene() = 0;

        /// \brief 设置不允许关闭UiView
        /// 仅在预关闭事件中有效,其他事件请勿使用
        /// 
        /// \return 
        virtual void SetDisableCloseUiViewOnlyInPreUiViewClose() = 0;
    };

}

